package com.you.learning.springcloud.order.task;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class OrderTaskWithACKService implements ChannelAwareMessageListener {
    boolean isConsumerSuccess = false;

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        String consumerQueue = message.getMessageProperties().getConsumerQueue(); //消费的队列
        try {
            //因为传递消息的时候用的map传递,所以将Map从Message内取出需要做些处理
            String msg = message.toString();
            String[] msgArray = msg.split("'");//可以点进Message里面看源码,单引号直接的数据就是我们的map消息数据
            System.out.println("  消费到消息  msg=" + msgArray.toString());
            System.out.println("消费的主题消息来自：" + consumerQueue);
            //模拟消费失败
            if (!isConsumerSuccess) {
                int index = 1 / 0;
            }
            if (("springBootTopicQueue1").equals(consumerQueue)) {
                // TODO 业务逻辑1
            } else if (("springBootTopicQueue2").equals(consumerQueue)) {
                // TODO 业务逻辑2
            } else {
                // TODO 业务逻辑3
            }
            System.out.println("消费消息成功：" + msg);
            channel.basicAck(deliveryTag, true); //第二个参数，手动确认可以被批处理，当该参数为 true 时，则可以一次性确认 delivery_tag 小于等于传入值的所有消息
//			channel.basicReject(deliveryTag, true);//第二个参数，true会重新放回队列，所以需要自己根据业务逻辑判断什么时候使用拒绝
            channel.basicNack(deliveryTag, false, false); //直接丢弃消息
        } catch (Exception e) {
            //模拟成功，下次可以正常消费
            isConsumerSuccess = true;
            System.out.println("消费消息失败：" + consumerQueue);
            channel.basicReject(deliveryTag, true); //true会重新放回队列
            e.printStackTrace();
        }
    }

}
